package com.zbkj.crmeb.store.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.common.PageParamRequest;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zbkj.crmeb.enums.BusinessTypeEnums;
import com.zbkj.crmeb.store.model.StoreOrder;
import com.zbkj.crmeb.store.model.StoreOrderInfo;
import com.zbkj.crmeb.store.model.StoreProductAttrValue;
import com.zbkj.crmeb.store.request.StoreProductAttrValueSearchRequest;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;

/**
* @author Mr.Zhang edit by stivepeim 7-6
* @description StoreProductAttrValueService 接口
* @date 2020-05-27
*/
public interface StoreProductAttrValueService extends IService<StoreProductAttrValue> {

    /**
     * 商品属性分页李贝奥
     * @param request 条件参数
     * @param pageParamRequest 分页参数
     * @return 商品属性集合
     */
    List<StoreProductAttrValue> getList(StoreProductAttrValueSearchRequest request, PageParamRequest pageParamRequest);

    /**
     * 根据商品id获取sku数据和推送平台关联数据
     */
    List<StoreProductAttrValue> listRelationInfoByProductId(List<Integer> productIds, BusinessTypeEnums businessTypeEnums);

    /**
     * 根据商品id获取
     * @param productId 商品id
     * @return 商品属性集合
     */
    List<StoreProductAttrValue> getListByProductId(Integer productId);

    /**
     * 根据商品id和attrId获取列表集合
     * @param productId 商品id
     * @param attrId 属性id
     * @return 商品属性集合
     */
    List<StoreProductAttrValue> getListByProductIdAndAttrId(Integer productId, String attrId);

    /**
     * 根据商品id和attrId获取列表集合
     * @param productId 商品id
     * @param skuId 属性 source_sku_id
     * @return 商品属性集合
     */
    List<StoreProductAttrValue> getListByProductIdAndSkuId(Integer productId, String skuId);

    /**
     * 根据商品属性查询
     * @param storeProductAttrValue 商品属性参数
     * @return 商品属性结果
     */
    StoreProductAttrValue getByEntity(StoreProductAttrValue storeProductAttrValue);

    /**
     * 加销量，减库存
     * @param productId 商品id
     * @param attrValueId 商品attrValue id
     * @param num 销售数量
     * @param type 是否限购
     * @return
     */
    boolean decProductAttrStock(Integer productId, String attrValueId, Integer num, Integer type, Integer activityGroupId);

    /**
     * 根据商品删除attrValue
     * @param productId
     * @return
     */
    boolean removeByProductId(Integer productId);

    /**
     * 根据商品删除attrValue
     * @param productId
     * @return
     */
    List<StoreProductAttrValue> listByProductId(Integer productId);

    /**
     *
     * 退货退款,加库存
     * @author cyz
     * @date 2021/4/21 15:57
     * @param storeOrder
     * @return boolean
     */
    void addProductAttrStock(StoreOrder storeOrder);
    
    /**
     * 利用数据库进行库存加减操作
     * @Description:  
     * @author daigb 
     * @param @param productId
     * @param @param num
     * @param @return
     * @return Boolean
     * @throws
     */
    Boolean subProductStock(Integer productId,String sourceSkuId, Integer stock);

    Boolean subProductStockByJky(String subProductStock, Integer stock);

    void addProductValueStock(StoreOrderInfo storeOrderInfo);

    void updateValueSourceCost(List<Integer> productIdList);

    void updatePrice(List<Integer> productIdList, BigDecimal price);

    /**
     * 功能描述: 根据wrappers字段更新value值
     * @Param: [entityList, queryWrapperFunction]
     * @Return: boolean
     * @Author: wangzh
     * @Date: 2023/3/21 13:46
     */
    boolean updateBatchByQueryWrapper(Collection<StoreProductAttrValue> entityList, Function<StoreProductAttrValue, LambdaQueryWrapper> queryWrapperFunction);

}
